﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _1_基本控件的使用
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            int a = 0;
        }

        private void BTN_test_Click(object sender, EventArgs e)
        {
            //TB_test是通过(Name)属性修改的textbox控件的名字
            //.text表明此控件显示的内容
            //+="a"表示追加字符a，
            TB_test.Text += "a";

            if (sender == TB_test)               //如果参数等于编辑框的变量
                BTN_test.Text = "编辑框按下";    //按键文本显示"编辑框按下"
            else if (sender == BTN_test)
                BTN_test.Text = "按键按下";
        }

        int a = 0; //变量定义到函数外边
        private void BTN_test2_Click(object sender, EventArgs e)
        {
            //把变量a的数据转成字符串，显示到按钮上
            //.toString()参数“X2”表示十六进制大写、两位
            BTN_test2.Text = "十进制："+a.ToString()+"，十六进制:"+a.ToString("X2");
            a++;
        }

        private void BTN_test3_Click(object sender, EventArgs e)
        {
            int b;
            //判断并转换TB_num控件输入的内容
            //转换后的数据返回到变量b中
            //注意，b前边的out不能省略，
            //此关键字表示数据可以把修改的值传递到函数外边
            //可类比于C语言scanf中的变量前边的&
            if (int.TryParse(TB_num.Text, out b) == true)
            {
                //把转换后的数据显示到按键上
                BTN_test3.Text = b.ToString();
            }
            else
            {
                BTN_test3.Text = "格式错误";
            }
        }

        private void BTN_test4_Click(object sender, EventArgs e)
        {
            //通过new TestClass();语句定义一个名字叫abc的类变量
            //此类应用时类似于C语言结构体变量
            //但本质类似于C语言的通过malloc分配的结构体指针
            TestClass abc = new TestClass();

            //类变量的a成员赋值为5
            abc.a = 5;

            //错误，小写s成员是private类型，无法外部调用
            //abc.s = "a";

            //同样是调用abc.add()函数，因为参数类型不同，
            //本质上调用的是不同函数，这就是函数重载
            int b = abc.add(1, 2);
            float f = abc.add((float)1.1, (float)2.2);

            //给属性S赋值，
            //但本质上调用的是里边的set函数
            //此函数在原有数据基础上添加字符串“喵~”
            abc.S = "张三";

            //打印字符串，会显示个“张三喵~”
            BTN_test4.Text = abc.S;
        }

        private void BTN_ArrTest1_Click(object sender, EventArgs e)
        {
            //1、int[]表示定义的数据类型是int[]类型，也就是int数组类型
            //2、arrs是数组变量
            //3、new 表示分配一段区域存放，类似于C语言的malloc
            //4、int[5]表明数组的长度是5个数据量
            //5、{ 0, 1, 2, 3, 4 }数据初始化
            int[] arrs = new int[5] { 0, 1, 2, 3, 4 };
            int x = arrs[0];     //数组读操作
            arrs[1] = 8;         //数组写操作
            double ave = arrs.Average();    //计算平均数
            int len = arrs.Length;          //获取数组数据个数
            int max = arrs.Max();           //返回数组最大值
            int sum = arrs.Sum();           //返回数组所有元素之和
            int[] arrs2 = new int[len];     //定义第二个数组变量
            arrs.CopyTo(arrs2, 0);          //从0位置开始把arrs里边的数据复制到arrs2中

            //获取的数据显示出来
            TB_ArrTest.Text = "数组平均值：" + ave.ToString();
            TB_ArrTest.Text += "\r\n数组最大值：" + max.ToString();
            TB_ArrTest.Text += "\r\n数组元素总和：" + sum.ToString();
            TB_ArrTest.Text += "\r\n数组元素长度：" + len.ToString();
            TB_ArrTest.Text += "\r\narrs2数组的元素：";
            foreach (int i in arrs2)
            {
                TB_ArrTest.Text += i.ToString() + ",";
            }
        }

        private void BTN_ListTest_Click(object sender, EventArgs e)
        {
            //1、List<int>表示数据类型是int类型的链表
            //2、listValue链表名字
            //3、new List<int> ，用于分配一个空间给变量listValue
            //4、{ 0, 1, 2, 3, 4 }给链表初始化
            List<int> listValue = new List<int> { 0, 1, 2, 3, 4 };
            //也可以不初始化，注意括号不能省略，此时listValue1里边没有任何数据
            List<int> listValue1 = new List<int>();

            listValue.Add(2);           //在最后边添加一个数据5；链表数据为{0,1,2,3,4,2}            
            listValue.Insert(0, -1);    //在0索引之前的位置插入一个数据-1；链表数据为{-1,0,1,2,3,4,2}
            TB_ListTest.Text = "链表添加数据后listValue的值";
            foreach (int item in listValue)
            {
                TB_ListTest.Text += item.ToString() + ",";
            }
            listValue.RemoveAt(4);      //移除索引为4的数据；链表数据为{-1,0,1,2,4,2}
            listValue.Remove(2);        //移除第一个为2的数据；链表数据为{-1,0,1,4,2}
            listValue.RemoveRange(1, 3);//移除索引为1~3的数据；链表数据为{-1,2}
            TB_ListTest.Text += "\r\n链表删除数据后listValue的值";
            foreach (int item in listValue)
            {
                TB_ListTest.Text += item.ToString() + ",";
            }

            listValue1.AddRange(listValue); //把listValue所有数据添加到listValue1中,listValue1数据{-1,2}
            listValue1.Add(1);              //listValue1数据{-1,2,1}
            listValue1.Add(0);              //listValue1数据{-1,2,1,0}
            TB_ListTest.Text += "\r\n排序前listValue1的值";
            foreach (int item in listValue1)
            {
                TB_ListTest.Text += item.ToString() + ",";
            }
            listValue1.Sort();              //从小到大排序，listValue1数据{-1，0,1,2}
            TB_ListTest.Text += "\r\n排序完成后listValue1的值";
            foreach (int item in listValue1)
            {
                TB_ListTest.Text += item.ToString() + ",";
            }

            bool p = listValue1.Contains(0);//判断元素0是否在列表中
            listValue1.Clear();             //清空列表，释放所有数据
        }
    }
}
